#pragma once
#include <iostream>
#include <stdexcept>
using namespace std;

// 矩阵类定义
class Matrix {
private:
    int rows;     // 矩阵行数
    int cols;     // 矩阵列数
    double** data; // 二维数组指针，用于存储矩阵数据
    void allocate_memory();    // 分配内存空间
public:
    // 构造函数 & 析构函数
    Matrix(int rows = 0, int cols = 0);  // 带默认参数的构造函数
    Matrix(const Matrix& other);         // 拷贝构造函数
    ~Matrix();                           // 析构函数

    // 运算符重载
    Matrix& operator=(const Matrix& other); // 赋值运算符
    Matrix operator+(const Matrix& other);  // 矩阵加法
    Matrix operator-(const Matrix& other);  // 矩阵减法
    Matrix operator*(const Matrix& other) const;  // 矩阵乘法
    Matrix operator*(double scalar) const;        // 标量乘法（右乘）
    friend Matrix operator*(double scalar, const Matrix& matrix);  // 标量乘法（左乘）

    // 下标访问运算符（支持[][]语法）
    double* operator[](int row);                   // 非常量版本
    const double* operator[](int row) const;       // 常量版本

    // 输入输出运算符
    friend ostream& operator<<(ostream& os, const Matrix& matrix);  // 输出流
    friend istream& operator>>(istream& is, Matrix& matrix);        // 输入流

    // 工具函数
    int getRows() const { return rows; }            // 获取行数
    int getCols() const { return cols; }            // 获取列数

    void initRandomly(double min = 0.0, double max = 1.0); // 随机初始化矩阵
    Matrix transpose() const;
    bool invert();

    /* 测试函数 */
    void test();
};